package homework.week3.composite;

import java.util.List;

/**
 * 窗体容器接口定义
 * 所有显示的组件都需要实现该接口
 */
public interface IContainer {

    /**
     * 是否为容器组件
     *
     * @return false
     */
    default boolean isContainer() {
        return false;
    }

    /**
     * 获取容器名称
     *
     * @return 容器名称
     */
    default String getContainerName() {
        return "default";
    }

    /**
     * 添加容器组件
     */
    default void add(IContainer iContainer) {
    }

    /**
     * 移除容器组件
     */
    default void remove(IContainer iContainer) {
    }

    /**
     * 容器宽
     *
     * @return
     */
    default int getWidth() {
        return 0;
    }

    /**
     * 容器高
     *
     * @return
     */
    default int getHeight() {
        return 0;
    }

    /**
     * 是否隐藏
     *
     * @return
     */
    default boolean hidden() {
        return false;
    }

    /**
     * 组件等级
     *
     * @return
     */
    default int level() {
        return 0;
    }

    /**
     * 如果为容器组件，则可以返回该组件包含的组件列表
     *
     * @return
     */
    default List<IContainer> getItems() {
        return null;
    }

    /**
     * 打印组件结构描述
     *
     * @return
     */
    default void print() {
        for (int i = 0; i < level(); i++) {
            System.out.print(" ");
        }
        if (isContainer()) {
            System.out.printf("组件%s, 高%d, 宽%d, 是否隐藏%s%n", this.getContainerName(), this.getHeight(), this.getWidth(), this.hidden());
            this.getItems().forEach(iContainer -> {
                int level = iContainer.level();
                for (int i = 0; i < level; i++) {
                    System.out.print(" ");
                }
                iContainer.print();
            });
        } else {
            System.out.printf("组件%s, 高%d, 宽%d, 是否隐藏%s%n", this.getContainerName(), this.getHeight(), this.getWidth(), this.hidden());
        }
    }

}
